package principal;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.Scanner;

import agenda.EntradaNoEncontrada;
import agenda.PosicionEnAgendaNoValida;
import agenda.utils.GeneradorXML;
import extendida.AgendaExtendida;

public class Principal {
    private Scanner scanner;
    private AgendaExtendida agenda;
    
    private Principal() {
	super();
	scanner = new Scanner(System.in);
	agenda = new AgendaExtendida();
    }
    
    private void ejecuta() {
	OpcionesMenu opcion = OpcionesMenu.SALIR;
	do {
	    muestraMenu();
	    opcion = pideOpcion();
	    filtraOpcion(opcion);
	}while(opcion != OpcionesMenu.SALIR);
    }
    
    private void filtraOpcion(OpcionesMenu opcion) {
	switch(opcion) {
		case NUEVA_PERSONA:
		    nuevaPersona();
		    break;
		case  NUEVA_EMPRESA:
		    nuevaEmpresa();
		    break;
		case BUSCAR_POR_NOMBRE:
		    buscaEntradaPorNombre();
		    break;
		case LISTAR_CONTENIDO:
		    mostrarContenidoAgenda();
		    break;
		case GENERAR_XML:
		    generarXMLAgenda();
		    break;
		case SALIR:
		    salir();
		    break;
		case BUSCAR_POR_DIRECCION:
		    buscaEntradaPorDireccion();
		case SERIALIZA:
		    serializaAgenda();
		    break;
		case DESERIALIZA:
		    deserializa();
		    break;
		default:
		    opcionNOValida();
		    break;
	}
    }

    private void deserializa() {
	try {
	    FileInputStream fis = new FileInputStream("src/main/resources/agenda.bin");
	    ObjectInputStream ois = new ObjectInputStream(fis);
	    agenda = (AgendaExtendida)ois.readObject();
	    ois.close();
	    fis.close();
	} catch (FileNotFoundException e) {
	    // NOTA Auto-generated catch block
	    e.printStackTrace();
	} catch (IOException e) {
	    // NOTA Auto-generated catch block
	    e.printStackTrace();
	} catch (ClassNotFoundException e) {
	    // NOTA Auto-generated catch block
	    e.printStackTrace();
	}
	
    }

    private void serializaAgenda() {
	File file = new File("src/main/resources/agenda.bin");
	FileOutputStream fos;
	try {
	    fos = new FileOutputStream(file);
	    ObjectOutputStream oos = new ObjectOutputStream(fos);
	    oos.writeObject(agenda);
	    
	    oos.close();
	    fos.close();
	} catch (FileNotFoundException e) {
	    // NOTA Auto-generated catch block
	    e.printStackTrace();
	} catch (IOException e) {
	    // NOTA Auto-generated catch block
	    e.printStackTrace();
	}
    }

    private void buscaEntradaPorDireccion() {
	System.out.println("Direccion?: ");
	String direccion = scanner.nextLine();
	System.out.println(agenda.buscaEntradaPorDireccion(direccion));
    }

    private void opcionNOValida() {
	System.out.println("La opcion que has introducido no es valida");
    }

    private void salir() {
	System.out.println("Bye!");
    }

    private void generarXMLAgenda() {
	System.out.println(GeneradorXML.generaAgendaXML(agenda));
    }

    private void mostrarContenidoAgenda() {
	int numeroEntradas = agenda.getNumeroEntradas();
	for(int i = 0; i < numeroEntradas; i++)
	    try {
		System.out.println(agenda.getEntradaEnPosicion(i));
	    } catch (PosicionEnAgendaNoValida e) {
//		e.printStackTrace();
	    }
    }

    private void buscaEntradaPorNombre() {
	System.out.println("Nombre?: ");
	String nombre = scanner.nextLine();
	try {
	    System.out.println(agenda.buscaEntradaPorNombre(nombre));
	} catch (EntradaNoEncontrada e) {
//	    e.printStackTrace();
	}
    }

    private void nuevaEmpresa() {
	System.out.print("Nombre de la empresa: ");
	String nombre = scanner.nextLine();
	System.out.println("NIF de la empresa: ");
	String nif = scanner.nextLine();
	System.out.print("Direccion: ");
	String direccion = scanner.nextLine();
	System.out.print("Numero de empleados: ");
	int numeroEmpleados = scanner.nextInt();
	scanner.nextLine();
	agenda.nuevaEmpresa(nombre, nif, direccion, numeroEmpleados);
    }

    private void nuevaPersona() {
	System.out.print("Nombre de la persona: ");
	String nombre = scanner.nextLine();
	System.out.println("Apellidos de la persona: ");
	String apellidos = scanner.nextLine();
	System.out.println("NIF de la persona: ");
	String nif = scanner.nextLine();
	System.out.print("Direccion: ");
	String direccion = scanner.nextLine();
	agenda.nuevaPersona(nombre, apellidos, nif, direccion);
    }

    private OpcionesMenu pideOpcion() {
	int opcion = 0;
	System.out.print("Selecciona una opcion: ");
	opcion = scanner.nextInt();
	scanner.nextLine();
	return OpcionesMenu.values()[opcion];
    }

    private void muestraMenu() {
//	System.out.println("1.- Nueva Persona.");
//	System.out.println("2.- Nueva Empresa");
//	System.out.println("3.- Buscar Entrada por nombre");
//	System.out.println("4.- Mostrar contenido de la agenda.");
//	System.out.println("5.- Generar XML de la agenda.");
//	System.out.println("0.- Salir.");
	for(OpcionesMenu opcion: OpcionesMenu.values()) {
	    System.out.println(opcion.ordinal() + ".- " + opcion.getTextoOpcion());
	}
    }

    public static void main(String[] args) {
	new Principal().ejecuta();
    }
}
